1 module hip.loaders.texture; 2 import hip.filesystem.hipfs; 3 import hip.asset_manager.load_task; 4 import hip.assetmanager; 5 import hip.api.data.commons; 6 import hip.console.log; 7 import hip.assets.texture; 8 9 final class HipTextureLoadTask : HipAssetLoadTask 10 { 11 private IHipFSPromise fs; 12 private HipResourceUsage usage = HipResourceUsage.Immutable; 13 this(string path, string name, HipAsset asset, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting) 14 { 15 super(path,name,asset,extraData, fileRequesting,lineRequesting); 16 if(extraData.length) 17 { 18 assert(extraData.length == HipResourceUsage.sizeof); 19 usage = *cast(HipResourceUsage*)extraData.ptr; 20 } 21 } 22 23 override void update() 24 { 25 final switch(result) with (HipAssetResult) 26 { 27 case waiting: 28 result = loading; 29 worker = HipAssetManager.loadWorker("Load and Decode Texture", () 30 { 31 fs = HipFS.read(path) 32 .addOnError((string error){result = cantLoad; this.error = error; }) 33 .addOnSuccess((in ubyte[] data) 34 { 35 asset = new Image(path, data, (IImage self) 36 { 37 result = mainThreadLoading; 38 }, (){ result = cantLoad; error = "Could not decode image for Texture."; }); 39 return FileReadResult.keep; 40 }); 41 }); 42 break; 43 case loading: 44 break; 45 case mainThreadLoading: 46 HipTexture t = new HipTexture(cast(Image)asset, usage); 47 asset = t; 48 hiplog("AssetManager: Texture: Loaded ", path, " ", t.toHipString.toString); 49 result = loaded; 50 break; 51 case cantLoad: goto case loaded; 52 case loaded: 53 if(fs !is null) 54 { 55 fs.dispose(); 56 fs = null; 57 } 58 break; 59 } 60 } 61 62 }